<html>
<head>
<meta charset="utf-8"></meta>
<title>BClass</title>
<link href="./style.css" rel="stylesheet" type="text/css"/>
	</head>
<body>
		<div class="class" name="BClass">
<h1>BClass</h1>
<p>继承自<a href="BObject.html">BObject</a></p>
			<p id="resume">BClass是脚本类，用于脚本（<a href="BScript.html">BScript</a>）中，其名称为类型名。<a href="#desc">详细</a></p><h2>public</h2>
<div id="public">
<h3>enum Access</h3>
				<table class="enum">
					<tr><td>Access_None</td><td>desc</td></tr>
					<tr><td>Access_Private</td><td>desc</td></tr>
					<tr><td>Access_Protected</td><td>desc</td></tr>
					<tr><td>Access_Public</td><td>desc</td></tr>
					<tr><td>Access_Max</td><td>desc</td></tr>
					<tr><td/><td>desc</td></tr>
				</table>
			</div>
<h2>public</h2>
<table id="public">
<tr><td align="right"/><td><a href="#BClass(const BString&,bool)">BClass</a>(const BString&amp; desc, bool meta = false);</td></tr>
<tr><td align="right"/><td><a href="#BClass(const BClass&)">BClass</a>(const BClass&amp; other);</td></tr>
<tr><td align="right"/><td><a href="#~BClass()">~BClass</a>();</td></tr>
<tr><td align="right">virtual void </td><td><a href="#copy(const BClass*)">copy</a>(const BClass* other);</td></tr>
<tr><td align="right">virtual BClass* </td><td><a href="#clone() const">clone</a>() const;</td></tr>
<tr><td align="right">bool </td><td><a href="#isMeta() const">isMeta</a>() const;</td></tr>
<tr><td align="right">bool </td><td><a href="#isTyped(const BString&) const">isTyped</a>(const BString&amp; type) const;</td></tr>
<tr><td align="right">void </td><td><a href="#setTempTypes(const BStringArray&)">setTempTypes</a>(const BStringArray&amp; tempTypes);</td></tr>
<tr><td align="right">const BStringArray&amp; </td><td><a href="#tempTypes() const">tempTypes</a>() const;</td></tr>
<tr><td align="right">BScript* </td><td><a href="#script() const">script</a>() const;</td></tr>
<tr><td align="right">BClass* </td><td><a href="#super() const">super</a>() const;</td></tr>
<tr><td align="right">BString </td><td><a href="#inherit() const">inherit</a>() const;</td></tr>
<tr><td align="right">bool </td><td><a href="#insertMethod(const BString&, METHOD,Access)">insertMethod</a>(const BString&amp; declare, METHOD method, Access access = Access_Public);</td></tr>
<tr><td align="right">bool </td><td><a href="#removeMethod(const char*)">removeMethod</a>(const char* name);</td></tr>
<tr><td align="right">bool </td><td><a href="#removeMethod(const BString&)">removeMethod</a>(const BString&amp; name);</td></tr>
<tr><td align="right">bool </td><td><a href="#containMethod(const char*)">containMethod</a>(const char* name);</td></tr>
<tr><td align="right">bool </td><td><a href="#containMethod(const BString&)">containMethod</a>(const BString&amp; name);</td></tr>
<tr><td align="right">Access </td><td><a href="#methodAccess(const char*) const">methodAccess</a>(const char* name) const;</td></tr>
<tr><td align="right">Access </td><td><a href="#methodAccess(const BString&) const">methodAccess</a>(const BString&amp; name) const;</td></tr>
<tr><td align="right">int </td><td><a href="#methodCount() const">methodCount</a>() const;</td></tr>
<tr><td align="right">Method </td><td><a href="#method(int) const">method</a>(int index) const;</td></tr>
<tr><td align="right">Method </td><td><a href="#method(int, BString&) const">method</a>(int index, BString&amp; name) const;</td></tr>
<tr><td align="right">Method </td><td><a href="#method(int, BString&, BString&) const">method</a>(int index, BString&amp; type, BString&amp; name) const;</td></tr>
<tr><td align="right">Method </td><td><a href="#method(const char*) const">method</a>(const char* name) const;</td></tr>
<tr><td align="right">Method </td><td><a href="#method(const BString&) const">method</a>(const BString&amp; name) const;</td></tr>
<tr><td align="right">bool </td><td><a href="#insertVariant(const char*, const char*,Access)">insertVariant</a>(const char* type, const char* name, Access access = Access_Public);</td></tr>
<tr><td align="right">bool </td><td><a href="#insertVariant(const BString&, const BString&,Access)">insertVariant</a>(const BString&amp; type, const BString&amp; name, Access access = Access_Public);</td></tr>
<tr><td align="right">bool </td><td><a href="#removeVariant(const char*)">removeVariant</a>(const char* name);</td></tr>
<tr><td align="right">bool </td><td><a href="#removeVariant(const BString&)">removeVariant</a>(const BString&amp; name);</td></tr>
<tr><td align="right">bool </td><td><a href="#containVariant(const char*) const">containVariant</a>(const char* name) const;</td></tr>
<tr><td align="right">bool </td><td><a href="#containVariant(const BString&) const">containVariant</a>(const BString&amp; name) const;</td></tr>
<tr><td align="right">Access </td><td><a href="#variantAccess(const char*) const">variantAccess</a>(const char* name) const;</td></tr>
<tr><td align="right">Access </td><td><a href="#variantAccess(const BString&) const">variantAccess</a>(const BString&amp; name) const;</td></tr>
<tr><td align="right">bool </td><td><a href="#setValue(const char*, const BValue&)">setValue</a>(const char* name, const BValue&amp; value);</td></tr>
<tr><td align="right">const BValue&amp; </td><td><a href="#value(const char*) const">value</a>(const char* name) const;</td></tr>
<tr><td align="right">bool </td><td><a href="#setValue(const BString&, const BValue&)">setValue</a>(const BString&amp; name, const BValue&amp; value);</td></tr>
<tr><td align="right">const BValue&amp; </td><td><a href="#value(const BString&) const">value</a>(const BString&amp; name) const;</td></tr>
<tr><td align="right">int </td><td><a href="#variantCount() const">variantCount</a>() const;</td></tr>
<tr><td align="right">BValue&amp; </td><td><a href="#variant(int)">variant</a>(int index);</td></tr>
<tr><td align="right">BValue&amp; </td><td><a href="#variant(int, BString&)">variant</a>(int index, BString&amp; name);</td></tr>
<tr><td align="right">BValue&amp; </td><td><a href="#variant(int, BString&, BString&)">variant</a>(int index, BString&amp; type, BString&amp; name);</td></tr>
<tr><td align="right">const BValue&amp; </td><td><a href="#variant(int) const">variant</a>(int index) const;</td></tr>
<tr><td align="right">const BValue&amp; </td><td><a href="#variant(int, BString&) const">variant</a>(int index, BString&amp; name) const;</td></tr>
<tr><td align="right">const BValue&amp; </td><td><a href="#variant(int, BString&, BString&) const">variant</a>(int index, BString&amp; type, BString&amp; name) const;</td></tr>
<tr><td align="right">virtual bool </td><td><a href="#input(const BString&, const BValue&)">input</a>(const BString&amp; text, const BValue&amp; value);</td></tr>
<tr><td align="right">using </td><td><a href="#BObject::query;()">BObject::query;</a></td></tr>
<tr><td align="right">virtual bool </td><td><a href="#query(const BString&, BValue&) const">query</a>(const BString&amp; text, BValue&amp; value) const;</td></tr>
			</table>
<div id="desc">
<h2>详细介绍：</h2>
				<p>BClass是脚本类，用于脚本（<a href="BScript.html">BScript</a>）中，其名称为类型名。<p>如果此类为元类，则此类型的变量中存放的不是BClass对象而是数值类型。元类数据没有实体对象：BClass* this。</p><h4>元数值类型见下表：</h4></p><table>
					<tr><td>char</td><td>字符</td></tr>
					<tr><td>byte</td><td>一个字节。</td></tr>
					<tr><td>short</td><td>二个字节的有符号整数。</td></tr>
					<tr><td>int</td><td>四个字节的有符号整数。</td></tr>
					<tr><td>long</td><td>八个字节的有符号整数。</td></tr>
					<tr><td>float</td><td>四个字节的浮点数。</td></tr>
					<tr><td>double</td><td>八个字节的浮点数。</td></tr>
					<tr><td>real</td><td>四个字节或八个字节的实数。</td></tr>
					<tr><td>string</td><td>字符串类，实体是BString。</td></tr></table><p>为脚本类注册一个方法：<br/><pre>BClass* class = new BClass("Machine");
class-&gt;registMethod("bool mover(float, int)", &amp;MyClass::method);
void MyClasss::method(int argc, BValue* argv)
{
	//参数argc：指示参数的数量，为实际使用的参数数量加一。
	//参数argv：指示此方法可用的参数表，可用内容与argc数目对应。
}				
					
					
					</pre><p>如上示例代码，注册方法的第一个参数是字符串，用于描述方法的格式，其中需要注意的是参数列表部分不可以指定数值名称，只能指定参数类型。原因是名称没有必要且增加解析工作量，因而不支持名称。</p><p>示例代码中给出方法的格式，其中argc数量比实际参数数量多一个。参数表argv[0]的意义如下：</p><table>
						<tr><td>TYPE value = argv[0]</td><td>当此类为元类型时，argv[0]表示具体数值，而不BClass对象。</td></tr>
						<tr><td>BClass* class = argv[0]</td><td>当此类为非元类时，argv[0]表示当前类对象即BClass* self。</td></tr>
						<tr><td>argv[0] = result</td><td>在方法执行结束后，argv[0]表示此方法的返回值，若无返回值则会被忽略。</td></tr></table><p>其它参数argv[1]~argv[n]为方法实际使用的参数。</p><p>自定义的类如果不是元类型则需要重写clone()方法，在创建一个此类型的对象时会被调用。</p><p>类可以作为模块被注册到多个脚本对象中，被注册的类不会参与实际的脚本运行。因此当使用this-&gt;script()方法尝试取得环境脚本时总是无法取得的。</p></p>
			</div>
<h2 id="docs">成员文档：</h2>
<div id="BClass(const BString&,bool)">
<h3>BClass(const BString&amp; desc, bool meta = false);</h3>
				<p>构造一个类，desc是类型的描述，meta指示此类是否为元类。</p>
			</div>
<div id="BClass(const BClass&)">
<h3>BClass(const BClass&amp; other);</h3>
			</div>
<div id="~BClass()">
<h3>~BClass();</h3>
			</div>
<div id="copy(const BClass*)">
<h3>virtual void copy(const BClass* other);</h3>
			</div>
<div id="clone() const">
<h3>virtual BClass* clone() const;</h3>
				<p>此方法对非元类是很必要的。</p>
			</div>
<div id="isMeta() const">
<h3>bool isMeta() const;</h3>
				<p>判断此类是否为元类。</p>
			</div>
<div id="isTyped(const BString&) const">
<h3>bool isTyped(const BString&amp; type) const;</h3>
				<p>判断此类是否属于指定的type类型。</p>
			</div>
<div id="setTempTypes(const BStringArray&)">
<h3>void setTempTypes(const BStringArray&amp; tempTypes);</h3>
				<p>设置模板类型表。</p>
			</div>
<div id="tempTypes() const">
<h3>const BStringArray&amp; tempTypes() const;</h3>
				<p>获得模板类型表。</p>
			</div>
<div id="script() const">
<h3>BScript* script() const;</h3>
				<p>获得当前脚本对象，即当前运行于哪个脚本环境。</p><p>注意：若此类是脚本的模块时不会参与脚本的运行。</p>
			</div>
<div id="super() const">
<h3>BClass* super() const;</h3>
				<p>获得父类对象，父类可能有若干个，此方法只取得第一个。通常类都是单继承的。</p>
			</div>
<div id="inherit() const">
<h3>BString inherit() const;</h3>
				<p>获得父类型。通常类都是单继承的。</p>
			</div>
<div id="insertMethod(const BString&, METHOD,Access)">
<h3>bool insertMethod(const BString&amp; declare, METHOD method, Access access = Access_Public);</h3>
				<p>添加方法，declare是描述，method是函数地址，一般使用本类的成员函数，这样比较简洁。access是限定此方法的访问权限，默认为开放的。</p><p>需要注意的是declare字符串的使用中不可以加入参数名称，只需要指明参数类型即可。如：bool removeMethod(const string&amp;)是合理的，而bool removeMethod(const string&amp; name)则是不合理的。原因是添加的方法都是C++的函数，其被调用时参数名称不会被传递，只有值数组，即method(int argc, BValue* argv)，所以参数名称是没有必要的。</p><p>由于方法重载，对一个方法的调用时指定的方法名称是其基本名称+参数类型列表来表示的，如setNumber(int)和setNumber(long)是不同的。</p>
			</div>
<div id="removeMethod(const char*)">
<h3>bool removeMethod(const char* name);</h3>
				<p>删除一个方法，name为方法名称，成功返回true，失败返回false。</p>
			</div>
<div id="removeMethod(const BString&)">
<h3>bool removeMethod(const BString&amp; name);</h3>
				<p>删除一个方法，name为方法名称，成功返回true，失败返回false。</p>
			</div>
<div id="containMethod(const char*)">
<h3>bool containMethod(const char* name);</h3>
				<p>判断一个方法是否存在，name为方法名称，成功返回true，失败返回false。</p>
			</div>
<div id="containMethod(const BString&)">
<h3>bool containMethod(const BString&amp; name);</h3>
				<p>断一个方法是否存在，name为方法名称，成功返回true，失败返回false。</p>
			</div>
<div id="methodAccess(const char*) const">
<h3>Access methodAccess(const char* name) const;</h3>
			</div>
<div id="methodAccess(const BString&) const">
<h3>Access methodAccess(const BString&amp; name) const;</h3>
			</div>
<div id="methodCount() const">
<h3>int methodCount() const;</h3>
				<p>获取此类中方法的数量。</p>
			</div>
<div id="method(int) const">
<h3>Method method(int index) const;</h3>
				<p>获取一个方法的函数地址，index指定方法的索引值。</p>
			</div>
<div id="method(int, BString&) const">
<h3>Method method(int index, BString&amp; name) const;</h3>
			</div>
<div id="method(int, BString&, BString&) const">
<h3>Method method(int index, BString&amp; type, BString&amp; name) const;</h3>
			</div>
<div id="method(const char*) const">
<h3>Method method(const char* name) const;</h3>
			</div>
<div id="method(const BString&) const">
<h3>Method method(const BString&amp; name) const;</h3>
			</div>
<div id="insertVariant(const char*, const char*,Access)">
<h3>bool insertVariant(const char* type, const char* name, Access access = Access_Public);</h3>
			</div>
<div id="insertVariant(const BString&, const BString&,Access)">
<h3>bool insertVariant(const BString&amp; type, const BString&amp; name, Access access = Access_Public);</h3>
			</div>
<div id="removeVariant(const char*)">
<h3>bool removeVariant(const char* name);</h3>
			</div>
<div id="removeVariant(const BString&)">
<h3>bool removeVariant(const BString&amp; name);</h3>
			</div>
<div id="containVariant(const char*) const">
<h3>bool containVariant(const char* name) const;</h3>
			</div>
<div id="containVariant(const BString&) const">
<h3>bool containVariant(const BString&amp; name) const;</h3>
			</div>
<div id="variantAccess(const char*) const">
<h3>Access variantAccess(const char* name) const;</h3>
			</div>
<div id="variantAccess(const BString&) const">
<h3>Access variantAccess(const BString&amp; name) const;</h3>
			</div>
<div id="setValue(const char*, const BValue&)">
<h3>bool setValue(const char* name, const BValue&amp; value);</h3>
			</div>
<div id="value(const char*) const">
<h3>const BValue&amp; value(const char* name) const;</h3>
			</div>
<div id="setValue(const BString&, const BValue&)">
<h3>bool setValue(const BString&amp; name, const BValue&amp; value);</h3>
			</div>
<div id="value(const BString&) const">
<h3>const BValue&amp; value(const BString&amp; name) const;</h3>
			</div>
<div id="variantCount() const">
<h3>int variantCount() const;</h3>
			</div>
<div id="variant(int)">
<h3>BValue&amp; variant(int index);</h3>
			</div>
<div id="variant(int, BString&)">
<h3>BValue&amp; variant(int index, BString&amp; name);</h3>
			</div>
<div id="variant(int, BString&, BString&)">
<h3>BValue&amp; variant(int index, BString&amp; type, BString&amp; name);</h3>
			</div>
<div id="variant(int) const">
<h3>const BValue&amp; variant(int index) const;</h3>
			</div>
<div id="variant(int, BString&) const">
<h3>const BValue&amp; variant(int index, BString&amp; name) const;</h3>
			</div>
<div id="variant(int, BString&, BString&) const">
<h3>const BValue&amp; variant(int index, BString&amp; type, BString&amp; name) const;</h3>
			</div>
<div id="input(const BString&, const BValue&)">
<h3>virtual bool input(const BString&amp; text, const BValue&amp; value);</h3>
			</div>
<div id="BObject::query;()">
<h3>using BObject::query;</h3>
			</div>
<div id="query(const BString&, BValue&) const">
<h3>virtual bool query(const BString&amp; text, BValue&amp; value) const;</h3>
			</div>
		</div>
	</body>
</html>